// IO 函子

// IO函子中的_value是一个函数，这里是把函数作为值来处理
// I0函子可以把不纯的动作存储到_value中，延迟执行这个不纯的操作(惰性执行)，包装当前的操作
// 把不纯的操作交给调用者来处理

const fp = require('lodash/fp');

class IO {
  // 传入一个值  返回一个函数包裹  值一般就是我们输入的值
  static of(value) {
    return new IO(function () {
      return value;
    });
  }

  // 传入一个函数
  constructor(fn) {
    this._value = fn;
  }

  // 最终返回的是 组合函数的函子
  map(fn) {
    // 组合函数
    return new IO(fp.flowRight(fn, this._value));
  }
}

// 调用   process：node中的进程
let r = IO.of(process).map((p) => p.execPath);
// console.log(r)
console.log(r._value());
